
import dayjs from "dayjs";
import useService from "@/hooks/useService";

const calculateDay = (dValue:string, startIdx: number) => {
	const leftStr = dValue?.substring(startIdx);
	const diff = isNaN(+leftStr) ? 0 : +leftStr;
	return diff;
};

const serviceVariables: string[] = [
  "#上月初(财务)", "#上月末(财务)", "#本月初(财务)", "#本月末(财务)",
  "#去年本月初(财务)", "#去年本月末(财务)", "#去年上月初(财务)", "#去年上月末(财务)"
];

const convertLocalDateTime =(dValue?: string, dFormat?: string)=> {
  if( dValue && (typeof dValue?.startsWith === "undefined" || !dValue?.startsWith?.("#"))) {
    return dValue?.toString()?.trim() || "";
  }
  
  if (dValue?.startsWith("#今天+")) {
    const diff = calculateDay(dValue, 4);
    const retValue = dayjs().add(diff, "d").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue?.startsWith("#今天-")) {
    const diff = calculateDay(dValue, 4);
    const retValue = dayjs().subtract(diff, "d").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue?.startsWith("#上月今天+")) {
    const diff = calculateDay(dValue, 6);
    const retValue = dayjs().subtract(1, "M").add(diff, "d").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue?.startsWith("#上月今天-")) {
    const diff = calculateDay(dValue, 6);
    const retValue = dayjs().subtract(1, "M").subtract(diff, "d").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue?.startsWith("#去年今天+")) {
    const diff = calculateDay(dValue, 6);
    const retValue = dayjs().subtract(1, "y").add(diff, "d").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue?.startsWith("#去年今天-")) {
    const diff = calculateDay(dValue, 6);
    const retValue = dayjs().subtract(1, "y").subtract(diff, "d").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue?.startsWith("#本月+")) {
    const diff = calculateDay(dValue, 4);
    const retValue = dayjs().startOf("M").add(diff, "M").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue?.startsWith("#本月-")) {
    const diff = calculateDay(dValue, 4);
    const retValue = dayjs().startOf("M").subtract(diff, "M").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue?.startsWith("#本周+")) {
    const diff = calculateDay(dValue, 4);
    const retValue = dayjs().isoWeekday(1).add(diff, "w").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue?.startsWith("#本周-")) {
    const diff = calculateDay(dValue, 4);
    const retValue = dayjs().isoWeekday(1).subtract(diff, "w").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue?.startsWith("#上周同期-")) {
    const diff = calculateDay(dValue, 6);
    const retValue = dayjs().subtract(diff, "w").subtract(1, "d").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue?.startsWith("#上月同期-")) {
    const diff = calculateDay(dValue, 6);
    const retValue = dayjs().subtract(diff, "M").subtract(1, "d").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#今天") {
    const retValue = dayjs().format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#今天子时") {
    const retValue = dayjs().startOf("d").format("YYYY-MM-DD HH:mm:ss");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#现在") {
    const retValue = dayjs().format("YYYY-MM-DD HH:mm:ss");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#昨天") {
    const retValue = dayjs().subtract(1, "d").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#上月今天") {
    const retValue = dayjs().subtract(1, "M").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#去年今天") {
    const retValue = dayjs().subtract(1, "y").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#上周同期") {
    const retValue = dayjs().subtract(1, "w").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#本月初") {
    const retValue = dayjs().startOf("M").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#本月末") {
    const retValue = dayjs().endOf("M").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#去年本月初") {
    const retValue = dayjs().subtract(1, "y").startOf("M").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#去年本月末") {
    const retValue = dayjs().subtract(1, "y").endOf("M").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#去年上月初") {
    const retValue = dayjs().subtract(1, "y").subtract(1, "M").startOf("M").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#去年上月末") {
    const retValue = dayjs().subtract(1, "y").subtract(1, "M").endOf("M").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#去年上月末") {
    const retValue = dayjs().subtract(1, "y").subtract(1, "M").endOf("M").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#上月初") {
    const retValue = dayjs().subtract(1, "M").startOf("M").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#上月末") {
    const retValue = dayjs().subtract(1, "M").endOf("M").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#上年初") {
    const retValue = dayjs().subtract(1, "y").startOf("y").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#上年末") {
    const retValue = dayjs().subtract(1, "y").endOf("y").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#本年初") {
    const retValue = dayjs().startOf("y").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#本年末") {
    const retValue = dayjs().endOf("y").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#上周初") {
    const retValue = dayjs().isoWeekday(1).subtract(1, "w").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#上周末") {
    const retValue = dayjs().isoWeekday(1).subtract(1, "w").add(6, "d").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }
  
  const currWeekDay = dayjs().day(); // 今天是星期几
  const yesterday = dayjs().subtract(1, "d"); // 昨天
  const firstDofM = dayjs(yesterday).startOf("M"); 		// 月初
  const currDate = dayjs().date(); // 今天是几号
  const currWofM = Math.ceil((currDate + dayjs(firstDofM).day()) / 7); // 今天是第几周

  if (dValue === "#上月同期") {
    const retValue = dayjs().add(-1,"M").format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#上年同期") {
    const todayOfLastM = dayjs().subtract(1, "y");
    const firstDofLastM = dayjs(todayOfLastM).startOf("M"); 		// 上年同月初
    const targetDate = dayjs(firstDofLastM).add((currWofM - 1) * 7 + currWeekDay - dayjs(firstDofLastM).day(), "d");

    const monthDiff = targetDate.add(12, "M").month() !== dayjs().month();
    const retValue = (monthDiff ? dayjs() : targetDate).format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#上年同周") {
    const todayOfLastM = dayjs().subtract(1, "y");
    const firstDofLastM = dayjs(todayOfLastM).startOf("M"); 		// 上年同月初
    const targetDate = dayjs(firstDofLastM).add((currWofM - 1) * 7 + 1 - dayjs(firstDofLastM).day(), "d");

    const monthDiff = targetDate.add(12, "M").month() !== dayjs().month();
    const retValue = (monthDiff ? dayjs() : targetDate).format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  if (dValue === "#上月同周") {
    const todayOfLastM = dayjs().subtract(1, "M");
    const firstDofLastM = dayjs(todayOfLastM).startOf("M"); 		// 上年同月初
    const targetDate = dayjs(firstDofLastM).add((currWofM - 1) * 7 + 1 - dayjs(firstDofLastM).day(), "d");

    const monthDiff = targetDate.add(1, "M").month() !== dayjs().month();
    const retValue = (monthDiff ? dayjs() : targetDate).format("YYYY-MM-DD");
    return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
  }

  const currM = dayjs().month() + 1; // 从0开始
  const currY = dayjs().year(); // 年份

  if (dValue === "#本季度初") {
    if (currM >= 1 && currM <= 3) {
      const retValue = dayjs(`${currY}-01-01`).format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 4 && currM <= 6) {
      const retValue = dayjs(`${currY}-04-01`).format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 7 && currM <= 9) {
      const retValue = dayjs(`${currY}-07-01`).format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 10 && currM <= 12) {
      const retValue = dayjs(`${currY}-10-01`).format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    return "";
  }

  if (dValue === "#本季度末") {
    if (currM >= 1 && currM <= 3) {
      const retValue = dayjs(`${currY}-03-31`).format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 4 && currM <= 6) {
      const retValue = dayjs(`${currY}-06-30`).format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 7 && currM <= 9) {
      const retValue = dayjs(`${currY}-09-30`).format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 10 && currM <= 12) {
      const retValue = dayjs(`${currY}-12-31`).format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    return "";
  }

  if (dValue === "#去年本季度初") {
    if (currM >= 1 && currM <= 3) {
      const retValue = dayjs(`${currY}-01-01`).subtract(1, "y").format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 4 && currM <= 6) {
      const retValue = dayjs(`${currY}-04-01`).subtract(1, "y").format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 7 && currM <= 9) {
      const retValue = dayjs(`${currY}-07-01`).subtract(1, "y").format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }
    if (currM >= 10 && currM <= 12) {
      const retValue = dayjs(`${currY}-10-01`).subtract(1, "y").format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    return "";
  }

  if (dValue === "#去年本季度末") {
    if (currM >= 1 && currM <= 3) {
      const retValue = dayjs(`${currY}-03-31`).subtract(1, "y").format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 4 && currM <= 6) {
      const retValue = dayjs(`${currY}-06-30`).subtract(1, "y").format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 7 && currM <= 9) {
      const retValue = dayjs(`${currY}-09-30`).subtract(1, "y").format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 10 && currM <= 12) {
      const retValue = dayjs(`${currY}-12-31`).subtract(1, "y").format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    return "";
  }

  if (dValue === "#上季度初") {
    if (currM >= 1 && currM <= 3) {
      const retValue = dayjs(`${currY}-10-01`).subtract(1, "y").format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 4 && currM <= 6) {
      const retValue = dayjs(`${currY}-01-01`).format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 7 && currM <= 9) {
      const retValue = dayjs(`${currY}-04-01`).format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 10 && currM <= 12) {
      const retValue = dayjs(`${currY}-07-01`).format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    return "";
  }

  if (dValue === "#上季度末") {
    if (currM >= 1 && currM <= 3) {
      const retValue = dayjs(`${currY}-12-31`).subtract(1, "y").format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }
    
    if (currM >= 4 && currM <= 6) {
      const retValue = dayjs(`${currY}-03-31`).format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }
    
    if (currM >= 7 && currM <= 9) {
      const retValue = dayjs(`${currY}-06-30`).format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    if (currM >= 10 && currM <= 12) {
      const retValue = dayjs(`${currY}-09-30`).format("YYYY-MM-DD");
      return dFormat ?	dayjs(retValue).format(dFormat) : retValue;
    }

    return "";
  }

  return "";
};

const useDateTimeDefVal = (proxy?: { mdCode: string }) => {
  const mainService = useService({ prefix: "mainApi" });

  const findServiceVariableValue = async (dValue: string) => {
    if (!dValue) {
      return "";
    }

    const fetchReqProxy = { ModuleCode: proxy?.mdCode || "" };
    const fetchRes = await mainService.request<any, any>("系统框架", "FindServiceVariableValue", { ParamName: dValue }, "", "", fetchReqProxy);
    return (fetchRes || "").trim();
  }

  const calculateDValue = async (dValue?: string, dFormat?: string)=> {
    if (!serviceVariables.includes(dValue || "")) {
      return convertLocalDateTime((dValue || "").trim(), dFormat);
    }
    const retValue = await findServiceVariableValue(dValue || "");
    return retValue;
  }

  return { calculateDValue };
}

export default useDateTimeDefVal;
